{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# note:\n",
    "* [covariance matrix](http://docs.scipy.org/doc/numpy/reference/generated/numpy.cov.html)\n",
    "* [multivariate_normal](http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.multivariate_normal.html)\n",
    "* [seaborn  bivariate kernel density estimate](https://stanford.edu/~mwaskom/software/seaborn/generated/seaborn.kdeplot.html#seaborn.kdeplot)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "%reload_ext autoreload\n",
    "%autoreload 2\n",
    "%matplotlib inline\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "sns.set(context=\"notebook\", style=\"white\", palette=sns.color_palette(\"RdBu\"))\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import scipy.io as sio\n",
    "from scipy import stats\n",
    "\n",
    "import sys\n",
    "sys.path.append('..')\n",
    "\n",
    "from helper import anomaly\n",
    "\n",
    "from sklearn.cross_validation import train_test_split"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You want to divide data into 3 set. \n",
    "1. Training set\n",
    "2. Cross Validation set\n",
    "3. Test set.  \n",
    "\n",
    "You shouldn't be doing prediction using training data or Validation data as it does in the exercise."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['X', '__version__', 'Xval', '__header__', '__globals__', 'yval'])"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mat = sio.loadmat('./data/ex8data1.mat')\n",
    "mat.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "X = mat.get('X')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "divide original validation data into validation and test set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "Xval, Xtest, yval, ytest = train_test_split(mat.get('Xval'),\n",
    "                                            mat.get('yval').ravel(),\n",
    "                                            test_size=0.5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Visualize training data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x112cd7d30>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAArUAAAHxCAYAAABzgUSmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3Xt4nOV57/vve5jz6GCNJNsYGxtbtgkEcEigBNpsCOkC\nSjnspN0tJWTTZrPXalPSrqarSdukB1glF6cEVqhbslIaIMmiJeeEZLeLpmkxpBwCiQ2yJdv4bEua\nkSXNed7T/uMdjSVZJhaWLI39+1yXL/Cr0cwzsjX6+Zn7uW8jCIIAEREREZEmZs73AkRERERETpRC\nrYiIiIg0PYVaEREREWl6CrUiIiIi0vQUakVERESk6SnUioiIiEjTU6gVERERkaanUCsiIiIiTU+h\nVkRERESa3oIItXv27OG3fuu32LBhA1deeSVf+MIXGh/bt28ft912Gxs2bOC6665j06ZN87hSERER\nEVmI5j3UBkHA7bffTmdnJ9/85jf58z//czZu3Mh3v/tdAH77t3+b7u5uvvrVr3L99dfzkY98hEOH\nDs3zqkVERERkIbHnewHZbJa3ve1t/Nmf/RnJZJIVK1Zw6aWX8vLLL5PJZNi3bx//+I//SCwW4/bb\nb+f555/nqaee4iMf+ch8L11EREREFoh536nt6urigQceIJlMAvDyyy/z0ksvcfHFF/OTn/yEc889\nl1gs1rj9RRddxKuvvjpfyxURERGRBWjeQ+1EV155JbfccgsXXnghv/iLv8jQ0BDd3d2TbpPJZBgY\nGJinFYqIiIjIQjTv5QcT/Y//8T/IZrP8+Z//OX/1V39FuVwmGo1Ouk00GqVWqx3X/b3zne+kWq0e\nFYxFREREZGEYGhoiGo3y0ksvndD9LKid2nPPPZf3vOc9fPzjH+fJJ5+cNsDWajXi8fhx3V+tVsPz\nvLlYqoiIiIjMAtd1qVarJ3w/875Tm8vleOWVV7jqqqsa19asWYPjOHR1dbFjx45Jt89ms3R1dR3X\nfY/f7plnnpm9BYuIiIjIrHnve987K/cz7zu1+/bt43d/93cZGhpqXNu8eTOZTIaLLrqI1157bdJu\n7csvv8yFF144H0sVERERkQVq3kPt29/+ds477zw+8YlPsGPHDn74wx9y33338V/+y3/hXe96F0uX\nLuXjH/8427dv55FHHmHz5s184AMfmO9li4iIiMgCMu+h1jRN/vqv/5pkMsmv/dqv8clPfpJbb72V\nW265BdM02bhxI0NDQ7z//e/n29/+Ng8//DBLliyZ72WLiIiIyAIy7zW1ENa+PvTQQ9N+bPny5Tz+\n+OMneUUiIiIi0kzmfadWREREROREKdSKiIiISNNTqBURERGRpqdQKyIiIiJNT6FWRERERJqeQq2I\niIiIND2FWhERERFpegq1IiIiItL0FGpFREREpOkp1IqIiIhI01OoFREREZGmp1ArIiIiIk1PoVZE\nREREmp5CrYiIiIg0PYVaEREREWl6CrUiIiIi0vQUakVERESk6SnUioiIiEjTU6gVERERkaanUCsi\nIiIiTU+hVkRERESankKtiIiIiDQ9hVoRERERaXoKtSIiIiLS9BRqRURERKTpKdSKiIiISNNTqBUR\nERGRpqdQKyIiIiJNT6FWRERERJqeQq2IiIiIND2FWhERERFpegq1IiIiItL0FGpFREREpOkp1IqI\niIhI01OoFREREZGmp1ArIiIiIk1PoVZEREREmp5CrYiIiIg0PYVaEREREWl6CrUiIiIi0vQUakVE\nRESk6SnUioiIiEjTU6gVERERkaanUCsiIiIiTU+hVkRERESankKtiIiIiDQ9hVoRERERaXoKtSIi\nIiLS9BRqRURERKTpKdSKiIiISNNTqBURERGRpqdQKyIiIiJNT6FWRERERJqeQq2IiIiIND2FWhER\nERFpegq1IiIiItL0FGpFREREpOkp1IqIiIhI01OoFREREZGmtyBC7cDAAHfccQeXXHIJ73nPe/j0\npz9NrVYD4K677mL9+vWcc845jf9+6UtfmucVi4iIiMhCYs/3AgDuuOMO2tvb+fKXv8zIyAh//Md/\njGVZ/OEf/iE7d+7kYx/7GDfddFPj9ul0eh5XKyIiIiILzbzv1O7cuZOf/vSn3H333axevZqLLrqI\nO+64g+985zsA7Nixg7e97W1kMpnGr1gsNs+rFhEREZGFZN5DbVdXF5///Ofp6OhoXAuCgHw+T6FQ\nYGBggJUrV87fAkVERERkwZv3UNvS0sLll1/e+H0QBDzxxBO8+93vZufOnRiGwcaNG3nPe97DDTfc\nwDe+8Y15XK2IiIiILEQLoqZ2onvuuYetW7fy1FNPsWXLFkzTZPXq1Xzwgx/khRde4JOf/CTpdJqr\nrrpqvpcqIiIiIgvEggq19957L48//jif/exnWbNmDWvWrOHKK6+ktbUVgLVr17Jr1y6+8pWvKNSK\niIiISMO8lx+Mu/POO/niF7/IvffeOymwjgfacWeffTaDg4Mne3kiIiIisoAtiFD7uc99jieffJLP\nfOYzXHPNNY3rDz30ELfddtuk2/b29rJq1aqTvUQRERERWcDmPdTu2LGDjRs3cvvtt7Nhwway2Wzj\n1xVXXMGLL77Io48+yt69e/nyl7/Mt771LT784Q/P97JFREREZAGZ95raZ555Bt/32bhxIxs3bgTC\nDgiGYdDb28tDDz3Egw8+yIMPPsiyZcu4//77Of/88+d51SIiIiKykBhBEATzvYi58t73vhcIg7OI\niIiILDyzldfmfadWZCZ816XY308tN0w000GqpwfT1l9jERGR053SgDQN33U59K3vUMtlG9fyvdtY\ncv11CrYiIiKnuXk/KCZyvMId2uyka7VclmL/9nlakYiIiCwUCrXSNGq54WNcz53klYiIiMhCo1Ar\nTSOa6TjG9cxJXomIiIgsNAq10jRSPT1EM52TrkUznaR61szTikRERGSh0OkaaRqmbbPk+uso9m+n\nlssRzWRI9azRITERERFRqJXmYto2Leesn+9liIiIyAKj8gMRERERaXoKtSIiIiLS9BRqRURERKTp\nKdSKiIiISNNTqBURERGRpqdQKyIiIiJNT6FWRERERJqeQq2IiIiIND2FWhERERFpegq1IiIiItL0\nFGpFREREpOkp1IqIiIhI01OoFREREZGmp1ArIiIiIk1PoVZEREREmp5CrYiIiIg0PYVaEREREWl6\nCrUiIiIi0vQUakVERESk6SnUioiIiEjTU6gVERERkaanUCsiIiIiTU+hVkRERESankKtiIiIiDQ9\nhVoRERERaXoKtSIiIiLS9BRqRURERKTpKdSKiIiISNNTqBURERGRpqdQKyIiIiJNT6FWRERERJqe\nQq2IiIiIND2FWhERERFpegq1IiIiItL0FGpFREREpOkp1IqIiIhI01OoFREREZGmp1ArIiIiIk1P\noVZEREREmp5CrYiIiIg0PYVaEREREWl6CrUiIiIi0vQUakVERESk6SnUioiIiEjTU6gVERERkaan\nUCsiIiIiTU+hVkRERESankKtiIiIiDQ9hVoRERERaXoKtSIiIiLS9BRqRURERKTpzXuoHRgY4I47\n7uCSSy7hPe95D5/+9Kep1WoA7Nu3j9tuu40NGzZw3XXXsWnTpnlerYiIiIgsRPMeau+44w6q1Spf\n/vKXeeCBB/jBD37Agw8+CMBv//Zv093dzVe/+lWuv/56PvKRj3Do0KF5XrGIiIiILDT2fD74zp07\n+elPf8qmTZvo6OgAwpB7zz338PM///Ps27ePf/zHfyQWi3H77bfz/PPP89RTT/GRj3xkPpctIiIi\nIgvMvO7UdnV18fnPf74RaMfl83l+8pOfcO655xKLxRrXL7roIl599dWTvUwRERERWeDmNdS2tLRw\n+eWXN34fBAFPPPEEl156KUNDQ3R3d0+6fSaTYWBg4GQvU0REREQWuHmvqZ3onnvuobe3l9///d+n\nXC4TjUYnfTwajTYOkYmIiIiIjFswofbee+/l8ccf57777mPNmjXEYrGjAmytViMej8/TCkVERERk\noVoQofbOO+/ki1/8Ivfeey9XXXUVAIsXL2ZoaGjS7bLZLF1dXfOxRBERERFZwOY91H7uc5/jySef\n5DOf+QzXXHNN4/oFF1zA66+/Pmm39uWXX+bCCy+cj2WKiIiIyAI2r6F2x44dbNy4kdtvv50NGzaQ\nzWYbvy6++GKWLl3Kxz/+cbZv384jjzzC5s2b+cAHPjCfSxYRERGRBWhe+9Q+88wz+L7Pxo0b2bhx\nIxB2QDAMg97eXh5++GH+5E/+hPe///2sWLGChx9+mCVLlsznkkVERERkATKCIAjmexFz5b3vfS8Q\nhmcRERERWXhmK6/Ne02tiIiIiMiJUqgVERERkaanUCsiIiIiTU+hVkRERESankKtiIiIiDQ9hVoR\nERERaXoKtSIiIiLS9BRqRURERKTpKdSKiIiISNNTqBURERGRpqdQKyIiIiJNT6FWRERERJqeQq2I\niIiIND2FWhERERFpegq1IiIiItL0FGpFREREpOkp1IqIiIhI01OoFREREZGmp1ArIiIiIk1PoVZE\nREREmp493wsQERGRueW7LsX+fmq5YaKZDlI9PZi2IoCcWvQ3WkRE5BTmuy6HvvUdarls41q+dxtL\nrr9OwVZOKSo/EBGRWeW7LvneXnLPbiLf24vvuvO9pNNauEObnXStlstS7N8+TysSmRv6J5qIiMwa\n7QouPLXc8DGu507ySkTmlnZqRURk1mhXcOGJZjqOcT1zklciMrcUakVEZNZoV3DhSfX0EM10TroW\nzXSS6lkzTysSmRt6L0hERGaNdgUXHtO2WXL9dRT7t1PL5YhmMqR61qgcRE45+hstIiKzJtXTQ753\n26QSBO0Kzj/Ttmk5Z/18L0NkTinUiojIrNGuoIjMlxnX1N56662MjY0ddT2Xy3HjjTfOyqJERKR5\nje8KZi6/jJZz1ivQishJcVyvND/84Q/ZvHkzAC+++CJ/8zd/QzKZnHSb3bt3s3///tlfoYiIiIjI\nz3BcoXbZsmX85V/+JUEQAPD0009jmkc2eQ3DIJlM8t/+23+bm1WKiMiCpjGsIjLfjusVZ82aNTzz\nzDMAXHnllTz11FN0dEx/wlVERE4vJ3PggsKziBzLjF8J/uVf/mUu1iEiIk3qzQYuzOaJe00rE5E3\nM+NXgVtvvfVNP/7YY4+95cWIiEjzOVkDF05WeBaR5jTjULts2bJJv3ddl927d9PX18eHPvShWVuY\niIjMrrl66/5kDVzQtDIReTMzfjW7++67p73+8MMPc+jQoRNekIiIzL65fOv+ZA1c0LQyEXkzM+5T\neyw33HAD3/ve92br7kRE5E34rku+t5fcs5vI9/biu+6b3v7N3rqfDameNdjpNHY6TcfP/dyksDzT\ntR77MXqIZjonXTtWeJ6txxSR5jFrlfWvvPIKlmXN1t2JiMgxvJVd17l6696tVNjzhUepHjqImUgS\nzXRQ6N9Oul7jOps7xOPTygq9WxnbsgXgmIFWB8pETj+zclCsUCiwbds2br755llZlIiIHNtbOTA1\nF2/d+67L3r97lLH6cB6AWjZbX2O4lrk43FXo345bKABw+Ec/oti/fVJg1YEykdPTCR8UA4hEItxy\nyy1cf/31s7IoERE5trey6zoXda/F/n4qByefpfCKRYo7dmIYBhBQHRya8Vp/1mNODazVoUGG/umf\nsVtbiWY6Zv0xRaQ5zNpBMREROTneyq7r+Fv3xf7t1HI5opkMqZ41M3o7fmr3hOrgEFYiceQGQUAt\nl8MZGyPa3k7u2U34NQfDtjDMyUc4pq71WJ0ZpnvMiQLfp7Ctj8q+/SRWLA/va8pjBr5PbSiLVyxR\n3ruXlvPOo+Wc9SpFEDnFvKXv6P379/MP//APbNu2DcuyOPfcc/nVX/1VOjs7f/Yni4jICXmru66m\nbc/o7ffwsNVW8lu2EHg+zshhjEikERb9moO9qB0rm8UrlfDKZXzHIdbRQaQevA3bAs+HCaF26lqP\nVQPbfe3VDD79/UnXpwbWWm4Yr1QiNuHnz/hjBoTlEIW+7bj5PJHODObWrRx+8SU63n0pS2+8QcFW\n5BQy4+/mV155hdtuu41FixZx3nnn4XkeTz75JF/84hd54okn6OnpmYt1iohI3Vzsuk7tWeu7Lge/\n8U2Gn3s+DKz1X/Ezz6TlnPUYptkIj+l1a3Fyw5T27MGKx2ndcGEjdBqmSXr9emLd3ZPWCjC2eTNj\nW16jOjCAWywS7exsfF51aJD9T3yJ0u7djQNoEx9zPCT75RJWMtkI0eOPmerpobB1G9WBQbxyicB1\ncYeHiWQyeKUSxb5+Cr1bMWzrTb8GGskr0jxm/N356U9/mmuuuYY777wTu/7N7TgOn/jEJ/jv//2/\n8/d///ezvUYREZlipruuEx1Pd4Bifz/Fvn68UgmAwHHwHQdneBgnN0y0q/OowNqWH6O0Z++kUoPA\n9/GKxXqg7WgE2oNf/ybDzz+PWyxSG8riVyvEzziDtndswDBNCtv68IpFvHKZwHGwWlpo23Ahpm1P\neszEsmWU9u49qrzBr1QwIjaRtjZqQ0P4BviOg18uYyWTuMUiA9//PpH29sbnjL32Oi3r1uKMjhFp\nayW/rQ/n8OFjfo1EFrrT7R9mM35mW7du5e67724EWggPiv3n//yf+ZVf+ZVZXZyIiMyOiT/c3LEx\nqkODk4Lg1O4AtdwwXrnc+LgRiYT34ziTrse6uxufMzUsB75PZf+B8PPrj5Xv3Ua6ZzWF/n7cYhEn\nl8OvlPEqVSr792MYBvEVK8JAWyzi5PMAuKUSo6+8SvtF7zjmYwa+j5MbxojYWIkEge9jJRLh2gMI\nXAdndDT8vHSawDnSuzbwfYafe55ifz/Rzk6qg4OUd+8h2tWFnUoRyXSog4I0ldOxtd2Mhy+sWLGC\nrVu3HnV9//79LF26dFYWJSIis2f8h9v4IILh55+nsK2PwPeBIwepcv/+bGNQQTTTMekQmJVIYEYi\n4eGtapXynr0EjkNs+ZmNIQfF/n66r72azOWXk163DtOyCDwPJzfceKxaLsvYltfxyyX8eg2uYUcw\nLJPA83HzBWpDgxAEmIkEBAF+pUrgOLhjeQLPn1SPa9o23ddeTXzJEgrbtuGMjGCl05T27KWwrQ97\nUTuRRYvwa1W8SjUM5aUSbj6PvejILq1Tr831SuXw8Fn/dioDA5T37qW0Z0/j66UOCtIs5nrgykI0\n46j+4Q9/mLvuuovBwUEuueQSbNtm8+bNfOYzn+Hmm2/mxRdfbNz2Xe9616wuVkREZm7qDzczkcQb\nyuLkholkOsK3+kslMKgH3/CQVmptD9X6ITAMg/iZZxJ4PkY0gpVMEBgGO+65j/iyMxo7sdH65+Z7\nt1LavZtaLkctl8PKZkmvW1u/XYCZSOI7TrggA6xEEiseI9rVRWrVKqqDgxT6+gCjEXgN2yI9pWuB\n77oMfPu7HH7hRSoHD2FGIni1Gul1a6lls7iHR4h1deEMD+PXalipFHYqhRmL4QwfJtbdBdDYfbaS\nCZzcMIwH/vpurlcqhWUXGskrTWKuBq4sZDMOtX/0R38EhLW1Uz344ION/zcMg97e3hNYmoiIzIap\nP9yimQ5q2WwY5Oo7lFYySaSjo377LOU3drH0xhtoWb+esc3h9C67JUV5/4EJh7myVAcHseJxol2d\nBL5PfutWynt245bKGLF44zG9YpHSjp2YsRjtF19M6uyzKb2xq1Gza0YjxJctI71+HZnLLuPg174e\nhl4jLH2wkhGsVIqgUpn0XAr1nefqwYPhTis0uiGk160l0tqGm8+DAZWBQdyREapDWXzPxdy/n9Zz\nzyXa1YmVSDS+BpV9+zETCcxSCSNy5MekEbFPqK+vyMk0FwNXFroZh9pnnnlmLtYhIiJzZOoPN8M0\nSa9bS3LFCsp794EBkY6OKTW2OVrOWU/reeeSXr+OYn8/uX9/tnHgxDBN/HIYSL1yudEv9sjhLhcr\nlcJKJfErFWq5HO5YntjSJVQO7CeaybDq//1/OPDVr+MWi8QWdxPtzBDr6ia5ZjWJs85i9LXXCZxw\nd9VKJhs7rPne3sY6Rn+yGa9UatT8Qlj3Wx0aIra4m7YLLwACDnz161QPHMCvOWE3BM/HSqVwRkcw\nYzG6f+lain39OCOHwzrc+s50rKsTv1LFSiZYfPXVp2wtopx65mLgykI3KxPFRERk4Zruh1usq5uu\n910VhtVnNx31OeO7ORMPm9SyOcp79lAdHCTW1YkzOhaG2HSa/Guv4xw+jFcqg2ngFgoEg4PYLS1E\nu7vAtkksP5Pk6rMxTBPn8GHM9es58+b/i7EtrwMBrW9/O8k1qxl8+vtU9u8n2t6GVy5jmBbJFcuJ\ndHRQ2LqN4o4djXWWdr4R1t/G43B4BL9Ww7BM8P1JP8DdQgGvVMKv1QhcN6zjNQz8mkOkvQ0rGmXp\nTTdQ7N9OdWgIe0s7hmUeKavIdJLWATFpIrPR+q/ZzPiZDQ8Pc88997BlyxYqlQpBEEz6uHZyRURO\nnuNp2TP+w63Qu5WxLWEpwXjYmy7wRtoX4bsuuWc3TeqUEMl0YA4OUtm3D2d4GDMepzZ8GLdUAt8P\n3+bHwEwl8UrhbmjYLaFEtCNDYtXKI4MbXJe9j38Jr77bG+3uxrAjBEFALZclkunAymbBMIB69wQ/\nANua9NysdIogmw1bbxlh/S2GSbSzk+5rr25MJWv8rPIDAsCY8nUc35ke/9Xx7ktPqzAgp6YTaf3X\njGb8HfrJT36SV199lWuvvZa2tra5WJOIiByHmbbsKfRvxy0UADj8ox9R7N/Okuuvm7SbE2lrY6y3\nl4FvfwevXMYZHcWwLNLr12GYZrhDOzwc1p+2tkIQUB0YCAMnRtgLdmQEw7IwDAPDtjEiUQzbwh0Z\nIdoZ1t6O/viV8PPqobWy/wCl3bvJb92KaVlEMh2NoQ5euUxy5SriZyytHx47ItrZiTuWxx0dhSBc\ngxWP4Y7lKW7dRtuFF1Ds7yfS2oKVTAIQVKoEvk/g1KDe+SFyafu0/0A4nQKBSLObcah97rnneOSR\nR9TZQERkjhxvw/R871YKW7filctYiQT2onYKW7dyoFql7cLzJ33edO19qkODDP3TP2OlUnjFIlYq\nRWnXGxx+/keNbgDjk8SinRli3d34lQpWMklyxYpwLG61SliUa2E4JlQ9Aj+oB9oIRiSCGbHxaw5u\nsUiko4PSjp1UDw3glsuYVjjy1imWcMvhjq8ZiTS6JUS7wvG347WxU0NtyMCIRnFzOQLXw6tV8fv7\neeNvH+G8z9wffh07O0ksX04tmw178FbKYJh4tRrVbJbRn/6U7L/+K9WBQaxEgkim45Tv6Slyqpnx\nd2o8Hqerq2su1iIicto71u5r97VXU37jjUbQTaxaxeD3vk9pz57wRkGAu2ULdksLXrmMW8hPCmVT\nOyCMH+wq793XmPiFYeBXa7hjY2Gf2mQSK5HAK5WoDgwR6+6GSBQ3nyf/ei++5+KWyvilEkY0ghGN\nQaUKgQdW+OMlcB0CL4IZjWBGojiHR/HKZbxqBb9SITAMDNMMByVYFnYyiRGJNLolGJEIVixG+eBB\nYl1dRNoX4YwcmfIVuB52axr/jRoE4cZvUHPwzTJeoUDuB/9KcuVZ9eln63CGuygfOEh1YIBY92IS\ny5Zit7eT/cEP8auVxm6ulQ2//hq2INI8Zhxqb7rpJr7whS9w5513zsV6REROa8faUd37d38/qb1U\n8IN/xavVGr/3ymXcYhHDtrGS4dCEiROwpnZAqGWz1LJZDNumNpQlMMCvdy0IPC8cimAYjQ4GyVVn\nkVq9mrGfbqaWzTV6zAa1GoEBkUQCwzSIdmbwqjWMIIDAr+/W2pjxeHgAK5nEiMUwTAuCICwD8D3A\nANMgtmQxkY4ORl95ldroKEYQ1sCWvvIkse4u4kuXsOhd76qP2C1hxePY7e0EnkfgOI3a2XBnuMTI\nyz/GSibxaw6GbRHt7MQrlTAjkUbf3NpQFic/FoZhx8GMhLW9Tm74lO7pKXKqOa5Qe+uttzb+33Vd\nfvzjH/PDH/6QFStWYE6Zt/3YY4/N7gpFRE4j0zVMr+WG8ctlEiuWN65VDh7CjMewkvVDWfUhAYZp\nNfrNhp8bhrJUTw9jW16n0N+PVyxS3L4D33XCA17FItSPTwWmSVCt4hWLYJp4lTLGqE0p04nveVQH\nBjBj0cZAhMAwwjwaiWCnU41+r3ZrG+V9e/GrVQI/wCuXqQ0Mgm1jJBP4Ti2sgfX9xgEvuzPsuFDo\n3YpfqRDr6sYt5MNRuo6DX61QHRoi9+xzRNpawTDC5+66RBZ1UMvlMPwgfC6WhTNymPLefRT6+jBs\nCzyf9Pr1JJYto7R3b+PQmlsfyetXqxhFEywTK5Eg1tl5Svf0FDnVHFeondrG66yzzpqTxYiInO6m\na5jul0tYieSka1YigVcuh4ephoepHBzAGLFJ9aye1G92UigL8yfOaFgC4FcqBIFP4HkQBBimEU7k\nMoz6+/gBgRcQ4FLs66P0xk78ao3A97ASSYwIBI6JYUdILD+TSGsrZjyGV3MobO3FGcuDbeOXyxgG\nmHYEHAd3eJigMU3MCA+VRaOYfkB57z6ckVG8UhGvGE4y82vhEIbAcXEqI7ijY5jRSKM8opbLYUaj\nmLFYGMYDIKiBYeCWSwS+H35NTJNYdzepnjWTSjz8SpWg5oAf4PsOOBA4DmY0ekr39BQ51RxXqL37\n7rvneh0iIsIxesouWRruNE4QyXRge2FYi3Z2hpOw9h8g2tnZuM3EPq3F/n6cw4fDA1DbtuGWigTV\nsHwh8DzqqRPDMMP6WNOq93Ot18b6fhhoazUC3wfKGGbYx9VqSRNfvJhIpoOxLa9ReL0Xz3HA88B1\nw/u2bYy0Fbbtqu8Qh48ZPl4YSuNhN4NCATDwyiX8ag1Mox6ibfxikSDwcUZHgTDcRzMZ7JYW3Pqu\nbRhqfaiXODjDw42vy3jrrokdH9x8ntKuXfiOU68B9jFjUZJnn61DYiJNZMbfrd/4xjeO+bFoNMri\nxYu58MK6/OWmAAAgAElEQVQLsSzrmLc7llqtxvvf/34+9alPNbor3HXXXTzxxBMYhkEQhCdq//RP\n/5Tf+I3fmPH9i4gsdNM1TE+sWsng099vBN3A98HzaFm/PjzclEoT6+oisWol5Td2TdtbdbysYbyU\nIez5amOaZhhqTQO7tQ0rGsErV/CqVcJ0GIZePwgwYtFwx7RWw6vVMKJRrHicxPLlLL72Gsa2bKF6\n8FBYb1tfY3gHAbguXqmMGXXDxzaMelAPW3qZ0Qh2SxorHgfDIPBcggAMy8J3XaA+YCE4TOC6BI4T\n7jiXSkQzGdLr1lLLZuvdGMKdVt9xMCAcCFE3vnM9sX9nee/esBa4XlNsRGysROJnBtrj7VIhIifH\njL/7/vqv/5p9+/bh+z4tLS0A5PP5RugEWLVqFY8++ihLliw57vut1Wr81//6X9m+ffuk6zt37uRj\nH/sYN910U+NaOp2e6bJFRGbFyQgyEwPX+ONFMx1YiRhGPEGhdyuGZTUma0UznXS8+9KjGq37rtsY\nKeuOjYW7reUSmFY4pKC+I4llY9oW6fXnkFp5FuXBQUZeeAHPDQ+NBa4LloUVieIHATguhgFWPE58\n+Zkkz1qBGYsBRv3tfx98r943ti4ICDwXv+IDAYZp1XeBx0NtjGhnJ8Xt23HHxjAsGwIHq70NMxLF\nTqeItLURBAHBgQMEfhD2m3UczDPOILV6NdWBQYK+vjCY2hZeqYzvuo2Dc9ONCPVdFzudaoRhu7UF\nDAMrmaT17ecd889opj2CRWTuzfg77+abb+arX/0q9913H+vWrQNgx44d/OEf/iEf+MAHuOqqq/jT\nP/1T7r33Xu6///7jus8dO3bwB3/wB8f82Ic//GEyKtYXkXl2soPMdI8XOE5Yg1pvg1XLDVPeswcr\nHqPrF9/XmKBV6O1l4Pv/H4HjEqnX6Vb2H8CMx8N61EQSCDATSfxyCTudxk4lqeVy+MUiqdWrqRw4\niF8LW3wFrhvWxlomVjyGmUgQSaUxbRv38AjVoSHyr72GX99hxfOPej6GYYJlYdTfyRvvZWvGorRt\nuJBIWytFv/55BuGAh0WLSK5YTvs73kFp9x6CHdvxq1Xc0bH6eNwY8aVLiXZ1Ee3qJDo8jFcKp5RZ\nySSJM8+k493vbtTSTvxzGv/6VocGiSxaFD73ao1UzxrS69aSXr/umH8203WpmNhtQkROvhm/Cj/6\n6KM88MADjUALsHr1aj71qU/x0Y9+lJtvvpnf+73f4zd/8zeP+z5feOEFLr30Un7v936PCy64oHG9\nUCgwMDDAypUrZ7pMEZFZd7KDzHSPVzl4CCuZINLRQWFbXyPADT//I7xKle5rr2bw6e+T37qVcr2H\n7fggg/iyM0gsW4ZpRyhs345fqeAWw88fD3VeuYw7OoYRsYmfsTTceTUIa1khrDv1AwKvGO62Rux6\n94ACVjqFnW7BK1emfT6B72MY4RhdwzDBALulhcSZ4W4vhDXFpR07CHwfM5EIbx+Nkbni/6D0d49S\nHRgMp4cRlixEFi0KD7kBsa5ugMYUsvjSpSz/zf8bOx5/06/vkR62w3ilMu3v2EDX+65603+oTNel\nIryuFmAi82XGoXZsbKxRdjBRPB5ntP5C09raSrX+Vs7x+PVf//Vpr+/cuRPDMNi4cSP/9m//Rnt7\nO7fddhs33njjTJctInLCTnaQme7xwmEIZYLgyI7k+PVaLkvuBz+glsuGZQZ1XqmEkxsm2tVJpL2d\nVR/9XfZ8/u8obO9vdDnwSuEuLIYRHsiqOVT278crlzEjUYhGCQrFRr1sEATUqtVwF9dxiS1ZEr7V\nH483dovxp+zWeh5BEOAVS2E5QUeGoFLBHRujtGs31cFBvEqFtne9E290rDEpbfE1V4c1xsOH8Yql\ncLfatsPnb9kEK3xqw8NH1SJP3Zl9s6/v+IE7CIP2z9p5n65LRXhd7yqKzJcZh9p3vvOd3HvvvTzw\nwAONcDs2NsYDDzzAhg0bAPinf/onVq1adcKL27lzJ6Zpsnr1aj74wQ/ywgsv8MlPfpJ0Os1VV111\nwvcvIjITJzvITPd4410PqgcPhGG0XG6UIgS+T3nv/rBv7JQWYG59p9VO7w1rVqM2reedS3UoS3nP\nHtzR0XB6VzKJGY/jjo1RHcqGh70sK+xSUP9vI6y6Ln4QUBkcZPi553GGh8MaXN+fXE87Uf0AmVeu\nYIzlMU0Td3Qs7BsLOMPDjP3kp7Rf9A6ipkk000lyzWreeOhzlPftw0omcEsl/EIRMxbDMAzKe/eR\nf+11Oi5794x2zE/kz3O6LhXT1eyKyMkz41D7qU99ig996EP8wi/8AqtWrSIIAnbt2sWiRYv4n//z\nf7Jp0ybuu+8+PvvZz57w4m688UauvPJKWltbAVi7di27du3iK1/5ikKtiJx0JzPI+K5L4Lo4IyON\nuljDNIl1ddN97dVk//czHHjqawCYsRjlffuoDQ/TecUVVA8dJLKonVJ9rK7ve9SyWaxUCnw/HFNb\n73EbzXRQy2YnDXDA86mNjoWBNggarbkC28aIRBqTwBpzaT2X6sAAgeeF9b6WxTEibcgyIQjwS0UC\n08SvVQl8j0gmQzSTwYzFibS20XbhBaR61lDs7693QAjrZA1rBM/zwAl75prxOFjmm5aBTHfA70T+\nPKfrUvGzdoZFZG7N+Ltv+fLlPP3003z3u9+lt7cXy7K49dZb+aVf+iWi0SixWIxvf/vbrF69elYW\nOB5ox5199tn8x3/8x6zct4jITJysIONWKuz5wqNUDx3EiMUxDHDH8iy+5mrS69dh2jbJs1YQ6Vg0\nqQQBIHnmMvxqhdyzm8K368slvFIZF7BLZQq+jxmPY5hmo39rqmdNOD1sdJRIayuVwaFwOMKEIQzh\nwlwCg/HhY+ADvoc/3ue2foDNSqfDkbUTxvg2WFZYixs2PSDwA0w7Ek4MK5exkkniSxcTP2MpEDC8\n6TlGX3kFNz9WD9KA74efbxhY9d1aOHYZyJsd8DuRP8+p3SZEZH69pVfieDzO+9///mk/NnX62Il4\n6KGHeOWVV3j00Ucb13p7e2eltEFE5K2Y6yDjuy57/+5RxjZvblwbHzAwtnkLhmWS6unBGR1rTBPz\nSuXG4TG3WKRl3VpGXngRKxrFMI2wBtdxcMfG8CoVzFiMaMci3GLxyIGzYoloV1e9n2wxrIsdD7O+\nR2Pr1fOPrpWFxshbH4jGY0R71lDs3XokEAfhrm6kY1F9mpiB3dqCGY3hFvLhwzgO0WQSu72d/Guv\nk99qUtjW19hJtjs68EslzHgMCIhmMlipFF65HAb0CWUDE3dmw1KKwUmT1iYe8Gs5Z33j9od/9B/q\nOSvSpGb8HXvrrbe+6ccfe+yxt7yYqa644goeeeQRHn30Ua666ir+/d//nW9961s8/vjjs/YYIiIn\n25v1ui3291M5eOjIjYOA8t699XZTVdxCnnzvNtL1cbgTJ4hBWA9aHRzELZfxqhWcsTyBUwtLBtyw\n7jZwHGqmQeTwKJH2RXiFIpgGlX37wsDp+RCLYnheOJiB+vZsfQJY+CSmBNvxHV3PC4cs1HvYmrEY\ntZERcNywpjeZxIhGcUfHGmE9cB18xyVx5jJSa9YQuB7YVtjFoFSqH44rEVQqBJ6HnUoRxONYyWTj\na+Tm81QHB4GAxKpVk4ZVlPfswS2WSK9bOyXY5hp/Huo5K9L8ZvzdOnUn1nVddu/eTV9fHx/60IdO\neEHjbyMBvP3tb+ehhx7iwQcf5MEHH2TZsmXcf//9nH/++Sf8OCIiJ8vEEBtpayW/rQ/n8OHGxycG\nqFpuGCuRaHzMK5fDyViO0xgiUMtlYW0P0UznUfWgiVUrGXrmGcq7duMWi/iVypGesfXX18B1CSpV\nfNch//rrOKOjGBj4rhPeLgiwIlFoj+KO5cNuB344kteIhAMT/FoN3HDHFcuqh9ww+Ab1oQ12ugXD\ntogZ4e0NyyLV04NfrlCLZ3EOj1AcHcW0I0QzHUQ7u8hcdhm1XI5CXx9euXzkMJwdwYxEsNvaMAyT\n9DnrcA+P4JZKVAcHsVIpCn19FPr6CH7wr41SCAgPzXlD2UYHiCNfr3BnVz1nRU4NMw61d99997TX\nH374YQ4dOjTtx2ait7d30u+vvPJKrrzyyhO+XxGRNzNXk8Km7gJWh7LU6n1jx0PXxAAVzXQQyXRg\nTTm8Zbe0YLe3Ux0K23WNpdMsuenGo8biFvv7cUZGMaIRjIoZ7qyOj6s1678nwGptwTCMRi0rEB4C\nAzAMkitX0HreeYy9+iq14WG8cgW3UODIBLBoWEtbLzto7Nz64e5ubXCoMdrcSiYagdrL50mt7cFu\nSVOo9WE4DmYkQnLlWUQ7FmFYFrHuLvJbt+KVy5T37Qv70NqRcGiEZZFeE9a9Rrs6YSiLl05P2rEe\n7+U7fq1xGK48cVzukQNh6jkrcmqYtfdVbrjhBm688UbuvPPO2bpLEZGTYi7ffp66C+iXS5P6xo4b\nD1DjJ/IhHCJQOXQIu5Km5YLzKfZvPzIt641dDD79fZZcf92k3cRabhi/WiXW2YmdTFI7fDjcbYVG\nsMQ0MC2L2shIOBGsXA5H5kYiGNGwrVe0u4vS7j3Yixbh5gu4hSKB62JEbAzTCseijx8km1iKENAY\n2IBR73LgOETaWjGjUdxCAae+RiuZxBr/ulSqja9D2zsvovKVJ6kODODXagSejxk9csAtc9m7MeNx\narkc5fS+RmeIceO9fMcZpkl63VqSK1Zgt7QcdSBMPWdFTg2zFmpfeeUVLMv62TcUEVlg5vLt56m7\ngOP9YyfuGsLkAJXqWYNfrRBpbWXxtddQ6N9Oob9/0vjXSKZj2jVGMx1h+YJhYKVSxJNJarEsXrHU\nGJrgV6tUDx/GtOywr2y1Cn6AV6th1CJYLS2U9+wlqFbD9l+1GoFpYEQiGJaFlUqGB7Za0gSRCN7w\n4SO7wXAk5BoBmAaB4+CVK8QWL8Zua2sMVQDC9ZTLOGOjmEMJFr0zRe5ffhBOLvO8sPuD72FYNqZl\nkepZg1ssktlwIQD53l5yz26a9LUc7+U7Uayr+5hTwtRzVuTUMCsHxQqFAtu2bePmm2+elUWJiJxM\nc/n289RdwPG3wifWzY4HqOl2jIs732DxL/8Swde/Eba8SiQm7UxWh4aAgFpuGLutDVw3HJLg+5Pa\ncRkRm1hnBiybyoEDBK5bPzzmgn+kq2zgudQGhwCwY7GwntcwMCwLe+kSjMDHyxcxEwnMdBpnePjY\ngxYgvG/LwK9WcYaHab3wAowAaoeHqeaGcXI5DNuqD2ww2P/VrxF4HsX+/nD8bqmEYdkYlkNtZIRi\n/3Y6L7+8cffjgbQ6NBjuUpdLxJYs5cwPfZDq3n3H1apLPWdFTg0nfFAMIBKJcMstt3D99dfPyqJE\nRE6muXz7eeouoGGadFx6KS3nrMcZGZkUoPK9vdPuGJff2EXLeedRemNXuMObGyZSX/PYltcwIzaB\n71PY1ld/zDUkzlqBMzJG9dAh8MPa1urAIIHnE+nM4JfC/rVMLCOolwwYBJiWFXYhqAuCAG9kBCuZ\nJAh8gopL4NdD8ZupD2Ow4jGMSBSCcCd19Cc/wR0dDfvZui7VgcFwt7hSxjCtcBwvRhiKDS/sKDa+\nG2wYk2qgk2evonLgQD30JzFsi+w//e+jSjPejHrOijS/WTsoJiLSrOby7eeZ7AIea8e4OjREdWCQ\nav3wGICVzZI6e1XjcNd4+ysAd2SEWHc3zsgYGGCnU1QOHSLwfALfg6EhjFgMMxbDLRYnBFsT07Yw\no1FMO4KViOOWikDYMcGwbLxiMTxcVq1BqQimFXY/GGcYjfAZjt1NYMZiWKkUyeXLiS5aRPmNXfjV\naqPbTeD7+LUalYMHMaNRop2d4UCGSjUseTBNzFiM2OLFpNetpZbLTdrRrg1lqb7J4TsROT28pfdW\nDh48yJe+9CX6+vqwbZuenh5+9Vd/dVYHL4iInCxz/fbz8e4CHmvH2CsWcEYOHz1sob0dt1ikOpSl\nvGcPXqmEOeGQlJsfJXBcDNsKhyf4Xrgb6jhYhgn1GtnxUgQMMOwIVrqF5NlnY1omztgYfs0hEo9j\n2BGqA4fwq7XwoFjgh7vAkQhWKoVfrRD4AUYs1gjbVjyOmUhip1tIrFqJYRq4xSJuvoBXLoePbRjh\n/ZkGnufhFMI2YoZtYXgukUXtRDs6iC9dimGauPk8hXp3BCuRaJQpjE9IG6fuBSKnlxm/Ym/bto1b\nbrmFeDzO+eefj+/7fO1rX+NLX/oSX/nKV+jp6ZmLdYqIzKmF8PbzsXaMrWQKYNphC4VtfXilekeF\n0VHMUonkiuUA2C1teKUyfs2Z9DlmPA5BuIMbP2Mp5T178asVrFSKyKJFJFcsJ722h/Ke3aTWrK6P\nzDWpDg6GJQTV+vhbwwxLC5IJUuvWUtm1G69SxUokiK86i8rOXeGubzSCYRpUDx6i/eKLGfqXH+CM\njtTreSf00LVj4SSzmgOug2HbGLYNfoCVCA/HRRYtYmzLa5T27DnyhOr1wxM7HoRfO3UvEDmdzDjU\n3nPPPVxyySXcf//9xGIxAKrVKh/72Me47777+Nu//dtZX6SIyOngWDvGxf5+Cn19R90+0tbW+P/x\nqVsTtV/0Dsa2bKHY1xcexDItzJgd9qetVsPdUNMkvX4dZiSCFYvTcdmlxJcs4fBLLxHt7GyE6MD3\n8cZ3UCMRDD+cNGYm4iRXriQST2Kfcw6VPXvxXRf30CCRzgymYRDt7GwMZBh7+cdh31nTAtMAv95m\nzDAah+BwHDAt7FSS6OLF4Lq0XnAB7e/YQOA6FPr6J38h6ju948MpQN0LRE5HMw61P/7xj/lf/+t/\nNQItQCwW43d+53e45ZZbZnVxIiKnm+l2jI+1g2u3tpLqWUP5jV04Y2MkV64i0tpCrKubzOWXk+pZ\nw5Ibr2fXxr9h+NnnwDIxolGc4WEMywzrYQG/UiHe3c3Sm26k5Zz1R7XIgnCXuP1d78IZGaU6lAUr\nhmHbWNEodiqJ3ZIGwEmnsAB3dBSqVUgkqGazE2pdc3iOQ2zJYrxiEXcsj++6mLaN3d4W7s6aJr7r\nEu3IkDxrBYZpkjxrRWNtjWEK4yHeMEiffTaLr70GZ3RU3QtETlMz/o5PpVI4jnPU9emuiYjIiTvW\nDm6+d+ukgQxuIU/geyz9P29qBGPTtll89X/CSiZxhocp7d4T7tSWypjRSOMxwtpah9yzm3AOH6Y6\nOIhfqWAmkkTrLcTa3/EOzHicoWf+BTefx4xEiHR0hAG7rZVC71ackREC3w9LFqrVsFbW9bDbWgGI\ntLaG6zVNYosXE+vuxiuV8B2HxPIzw9A8OIgZieCMjVLY1kd63dpGKcH4WqbWFy++9hpa337eSf6T\nEZGFZMah9ud+7ue45557eOihh2hvbwdgeHiYe++9l0svvXTWFygiItPv4Bocoz/slL6x4zu9hmni\nez7Fvj7MdIpYd1fYmSCRwEylyD33PNWhbNgjNl8g2pnBME1q2SyLLr6YAIgvWcLS6385HMVrWbSe\ndy6+57H3scepHT5MLZcj8MKyBiuRwBk+TKRjERAOjUisWolXq+GOjNafhEG0q4tFP3cJdiLB8I/+\nI+yKUP/llUoEnt8oJZi4a31kDG4naXU5EDntzTjU/sEf/AG//uu/zhVXXMHKlSsxDIM33niD9vZ2\n/uqv/mou1igiItNwRseO7ojQ0YEzOjrpduM7vYXerQw8/T2seBwMAzdfwPJ84kuWgGVS2NZHLZsN\nPz8Ar1gi2rEIv1ajsHUbzuhIo4wgmulsjBEe27wZCNvcNhhgt7ViAJFF7cSXLiXSEe6ytpyznsSy\nZbj5AgCtbz+P9Pp1HP7Rf5BceRaJFcvDFmX17gat553bKCXQoAQROZYZvwosXbqU7373u3zzm9+k\nv7+fIAj4lV/5FX75l3+ZdDo9F2sUEZFpjL8VP7UjwnSn/k3bxrAtIh2LaGt/x6TQGFm0iNLuPY0y\ngHHOyGEMyyQIAioHDhDZ1UpqzRqiXZ2T+sCOh+u85+K7btin1rSIdmRIn7MOr1Ak0n7kUFusq5vu\nq//TUUF0vKWZYZpEuzon3L7rqOcy350qRGThmXGo/cAHPsBdd92lkbgicsqZOKUqmukg1dOzoHcA\nZzo0Yny4w9TQaJgmfjmsyzUjETwgcMNw69cc3PwYBAE1zyPo6yM6PNwYghA+ZhiuY4uXhEMZ6uJL\nFmPaNp3XXI1hWT9zZ3Uuh2CIyKlvxq/We/fuJZlMzsVaRETmje+6k6ZUAeR7tzXeYl+IZvpW/HTD\nHQLfx0q34LseXqmEEY9jlkp49Qlige9hWBbjxQWB4+KVStSyOdz8GLlnNxFpayWyaBGB7ze6EljJ\nsK9sNNMZtgw7jq+hSgtE5ETM+JXiwx/+MH/yJ3/Cb/3Wb7FixQri8fikj59xxhmztjgRkZMl3KHN\nTrp2Mkatnuju8Ezeip+6Exr4PpX9BwDqdaw5/JpD6/nn446NUctmsVta8KpVnOFhfMfBiNgEvk9h\n2za8UhErlSaa6SDakSFz2WW0rF8fhtpUilhX11GhdPz5VgeH8IrF8HbdXY3nrdICEXmrZhxqP/vZ\nz+J5Hi+++GJjbjdAEAQYhkFvb++sLlBE5GQYf2v+6OtzN2r1ZO8OT90JdfNjQFh+YJgmbReFtbbJ\nVatofft55Hu3Uujvp7xnD5FMBoKAaGcnlT17CAwj/Jplc5R27SLW1YmdStL1i+875trHn291aLAx\nCc1KJsN63AW+Ky4iC9+MXz0effTRuViHiMi8mu6t+fD63I1anavdYd91yfduJb9lCwCt551L+pxz\njtoJzT27qdHNAI7U2iaWnxl+zvp1jY4JtVwOIxIJ+89aVthBIQioZrN45TK1bBY3X8Atllh60w3T\nhtPx5+vkhhu9db1SKRwGYZpzvisuIqe2GYfaiy++eC7WISIyr+bjkNJc7A77rsvBb3yT4eeebwTH\nwy++RMellx4VNn9WkDdtm/Q568lv3Ubge3ilMm61ihmNAuCWSrhjYwSeD56PMzLC8PPP07J+3bSD\nEMafr1cuT7rulcon/LxFRGYcaiuVCp///OfZsmULlUolnBYzwWOPPTZrixMROVnm45DSeKgMfH9y\ni61L29/yfRb7+yn29R8ZIUu4G1rc3n/UTujxBPlifz/OyOFG2zBrKEtp926CIMArFsNAC5ixKFYi\ngVcqMbbltWlD7fjztRKJSdetZKL+8bnbFReRU9+MX63/4i/+gqeffprLLrtMh8JE5JRysg8ppXp6\nGHvt9Um7qlYySb5363F3DJiqVg/HU3ml8lE7occT5KfuJkcyHVjZbBhEPQ+vWMIwDaxEshHK3+z5\n5nu3hR0XJnZJqI/aVesuETkRM37F/Od//mc++9nPcsUVV8zFekREThumbdOybi3F/v7JE8FGDr/l\n+tJopmPaYGklE8ccyvBmjzO1RMEwTdLr1pJcsYJKNsuhr3+TwHXxKmW8SpnAdUm/7Zxp72tiiG45\n55yw+0EySay7W627ROSEzfgVxDAM1qzRv6ZFRGaDMzp21EQweOv1pameHlJre8IDXBN2f1Nret7S\nTuh0JQqxrm663ncVhd5exn78CrVcjsBxMSI20UwGc8Lhs6nGQ7QOhInIbJtxqH3f+97H1772NT76\n0Y/OxXpERE4rs911wbRtlt54Ay3r1zO2eWL3g/VvaSf0zUoUnNEx0uvX4QwPT95pHh19S2sXETkR\nx/UK94lPfKLx/8Vika9//es899xzrFy58qh/kd99992zu0IRkVPY+E5odWiQWm4Yv1witmQpiVUr\n3/J9mrZN63nn0nreubOyxmOVKIyPx52606wDXyIyH44r1O7bt2/S79/5zncCcODAgdlfkYjIacS0\nbbqvvZq9f/f3+OUyViKJYVsMPv39ExpGcKKTyo7HfLRBExE5luN6hXvppZd49tlnyehf3yIis678\nxhsYEZvEiuWNaycyhOFkTSqbjzZoIiLHclyvPFN70YqIyOyZ7SEMczWpbDonuw2aiMix6J/TIiLz\nbLYPi9Vyw0cPdMh0aGKXiJzSjjvUfu973yOdTv/M2914440ntCARkdPNbNem2m1tFLb1TZoqZmWz\nZC677ITXKiKyUB13qL3rrrt+5m0Mw1CoFRGZodmuTTU4RsmYSslE5BR23K+YmzZt0kExEZE5Mpu1\nqc7oGOl1a0+4f+zJ6KAgIjJbjuvVyTCMuV6HiIjMktnoH3uyOiiIiMyWY88ynEDdD0REmkeqp4do\nZmqgnVmN7pt1UBARWYiO65/bN910E7FYbK7XIiIis2A2anRnu82YiMhcO65XOI2+FRFpLidaozvb\nbcZERObacZUfiIjI6WU2ShhERE4mVfuLiMhRNAJXRJqNXp1ERGRaGoErIs1E5QciIiIi0vQUakVE\nRESk6SnUioiIiEjTU6gVERERkaanUCsiIiIiTU+hVkRERESankKtiIiIiDQ9hVoRERERaXoKtSIi\nIiLS9BRqRURERKTpKdSKiIiISNNTqBURERGRpqdQKyIiIiJNT6FWRERERJqeQq2IiIiIND2FWhER\nERFpegq1IiIiItL07PlegIiIiJz6fNel2N9PLTdMNNNBqqcH01YMkdmjv00iIiIyp3zX5dC3vkMt\nl21cy/duY8n11ynYyqxR+YGIiIjMqXCHNjvpWi2Xpdj//7d3/zFV3fcfx1/Q23uxCKPcKv5Yl1ak\nubROIFQZncYMbddlSHWarv5BOxrqktr4K1ttoa3TEh0w49z8sWEc67Q13WhnHcnSjjRx2tD6Y6PQ\nXVzlgs4bWwZUFnV4jwjfP/r1rreVWuuFcz7X5yMhet/3gi/u8YMvjp9zabMpEWKRo0qtZVmaO3eu\nDh06FJ4Fg0GVlJQoJydHhYWFeuutt2xMCAAArpbV89EQ854RToJY5phSa1mWVq5cqba2yO/alixZ\nogJGvUgAABOtSURBVLFjx+qVV15RUVGRnnjiCX344Yc2pQQAAFfL7U0dYu4d4SSIZY4otYFAQA8+\n+KCCwWDEvLGxUSdPntTatWs1adIkLV68WNnZ2aqrq7MpKQAAuFqJGRlye2+JmLm9tygxY7JNiRCL\nHLE7++DBg8rPz9fy5cuVlZUVnjc3N+uuu+6Sx+MJz3Jzc9XU1GRHTAAA8CXEu1waV1Soc8faZPX0\nyO31KjFjMheJIaoc8bdp0aJFl513dXVp7NixETOv16vOzs6RiAUAAKIk3uVSUqbP7hiIYY7YfjCU\nvr4+ud3uiJnb7ZZlWTYlAgAAgBM5utR6PJ7PFFjLspSQkGBTIgAAADiRo0ttWlqaurq6Imbd3d0a\nM2aMTYkAAADgRI4utVlZWfL7/RFna48cOaLs7GwbUwEAAMBpHF1qp0+frvHjx+upp55SW1ubampq\n1NLSooULF9odDQAAAA7iuFIbFxcX/n18fLy2bt2qrq4uLViwQH/605+0ZcsWjRs3zsaEAAAAcBpH\nvKTXJ7W2tkbcvvXWW7Vz506b0gAAAMAEjjtTCwAAAFwtx52pBQBE30B/v84dOyar5yO5valKzMjg\npzkBiCl8RQOAGDfQ368P99bL6ukOz860/lPjigoptgBiBtsPACDGfXyGtjtiZvV069yxNpsSAUD0\nUWoBIMZZPR8NMe8Z4SQAMHwotQAQ49ze1CHm3hFOAgDDh1ILADEuMSNDbu8tETO39xYlZky2KREA\nRB9XCABAjIt3uTSuqFDnjrXJ6umR2+tVYsZkLhIDEFP4igYA14F4l0tJmT67YwDAsGH7AQAAAIxH\nqQUAAIDxKLUAAAAwHqUWAAAAxqPUAgAAwHiUWgAAABiPUgsAAADjUWoBAABgPEotAAAAjEepBQAA\ngPEotQAAADAepRYAAADGo9QCAADAeJRaAAAAGI9SCwAAAONRagEAAGA8Si0AAACMR6kFAACA8Si1\nAAAAMB6lFgAAAMaj1AIAAMB4lFoAAAAYj1ILAAAA41FqAQAAYDxKLQAAAIxHqQUAAIDxKLUAAAAw\nHqUWAAAAxqPUAgAAwHiUWgAAABiPUgsAAADjUWoBAABgPEotAAAAjEepBQAAgPEotQAAADAepRYA\nAADGo9QCAADAeJRaAAAAGI9SCwAAAONRagEAAGA8Si0AAACMR6kFAACA8Si1AAAAMB6lFgAAAMaj\n1AIAAMB4lFoAAAAYj1ILAAAA41FqAQAAYDxKLQAAAIxHqQUAAIDxHF9qGxoa5PP5lJmZGf512bJl\ndscCAACAg7jsDnAlbW1tKigoUEVFhQYHByVJHo/H5lQAAABwEseX2kAgoIyMDKWmptodBQAAAA7l\n+O0HgUBAt99+u90xAAAA4GCOL7UdHR3av3+/vv3tb+vee+/Vhg0bdOHCBbtjAQAAwEEcvf3g1KlT\nOn/+vDwejzZt2qRgMKiKigqFQiGVlZXZHQ8AAAAO4ehSO2HCBL3zzjtKTk6WJPl8Pg0MDOjJJ5/U\n008/rbi4OJsTAgAAwAkcv/3gUqG9JD09XaFQSL29vTYlAgAAgNM4utQeOHBAeXl5CoVC4Znf71dK\nSopuvvlmG5MBAADASRxdanNycjRq1CiVl5ero6ND+/btU3V1tR577DG7owEAAMBBHL2nNjExUTt2\n7NC6deu0cOFCJSYm6qGHHtKjjz5qdzQAAAA4iKNLrfTxHtodO3bYHQMAAAAO5ujtBwAAAMAXQakF\nAACA8Si1AAAAMB6lFgAAAMZz/IViAAAATjTQ369zx47J6vlIbm+qEjMyFO+iWtmFZx4AAOAqDfT3\n68O99bJ6usOzM63/1LiiQoqtTdh+AAAAcJU+PkPbHTGzerp17libTYlAqQUAALhKVs9HQ8x7RjgJ\nLqHUAgAAXCW3N3WIuXeEk+ASSi0AAMBVSszIkNt7S8TM7b1FiRmTbUoEdjIDAABcpXiXS+OKCnXu\nWJusnh65vV4lZkzmIjEb8cwDAAB8CfEul5IyfXbHwP9j+wEAAACMR6kFAACA8Si1AAAAMB6lFgAA\nAMaj1AIAAMB4lFoAAAAYj1ILAAAA41FqAQAAYDxKLQAAAIxHqQUAAIDxKLUAAAAwHqUWAAAAxqPU\nAgAAwHiUWgAAABiPUgsAAADjUWoBAABgPEotAAAAjEepBQAAgPEotQAAADAepRYAAADGo9QCAADA\neJRaAAAAGI9SCwAAAONRagEAAGA8Si0AAACMR6kFAACA8Si1AAAAMB6lFgAAAMaj1AIAAMB4lFoA\nAAAYj1ILAAAA41FqAQAAYDxKLQAAAIxHqQUAAIDxKLUAAAAwHqUWAAAAxqPUAgAAwHiUWgAAABiP\nUgsAAADjUWoBAABgPEotAAAAjEepBQAAgPEotQAAADAepRYAAADGo9QCAADAeJRaAAAAGI9SCwAA\nAOM5vtRalqWysjJNmzZNM2fOVG1trd2RAAAA4DAuuwNcSWVlpfx+v3bu3KlgMKhVq1Zp4sSJuu++\n++yOBgAAAIdw9Jnavr4+1dXV6ZlnnpHP59OcOXNUWlqqXbt22R0NAAAADuLoUnv06FFdvHhR2dnZ\n4Vlubq6am5ttTAUAAACncXSp7erqUkpKilyu/+2S8Hq9CoVCOn36tI3JAAAA4CSO3lPb19cnt9sd\nMbt027KsK75/V1eX+vv7NXv27GHJBwAAgGvzwQcf6IYbbrjmj+PoUuvxeD5TXi/dHjVq1BXf3+12\na3BwcFiyAQAA4Nq5XK7PnMT8Uh8nClmGTVpamnp7ezUwMKD4+I93SnR3dyshIUHJyclXfP/Dhw8P\nd0QAAAA4gKP31GZmZsrlcqmpqSk8O3z4sKZMmWJjKgAAADiNo0ttQkKCHnjgAa1evVotLS1qaGhQ\nbW2tHnnkEbujAQAAwEHiBh2+6fT8+fNas2aNXn/9dSUlJam0tFTFxcV2xwIAAICDOL7UAgAAAFfi\n6O0HAAAAwBdBqQUAAIDxKLUAAAAwHqUWAAAAxqPUAgAAwHgxW2oty1JZWZmmTZummTNnqra21u5I\nGEYNDQ3y+XzKzMwM/7ps2TK7YyHKLMvS3LlzdejQofAsGAyqpKREOTk5Kiws1FtvvWVjQkTT5Y53\nRUXFZ9b6iy++aGNKXKvOzk4tXbpUeXl5mjVrln7605/KsixJrO9Y9HnH+1rXt6N/TO61qKyslN/v\n186dOxUMBrVq1SpNnDhR9913n93RMAza2tpUUFCgiooKXXqVOo/HY3MqRJNlWVq5cqXa2toi5kuW\nLJHP59Mrr7yihoYGPfHEE/rzn/+scePG2ZQU0TDU8W5vb9ePfvQjzZ8/PzwbPXr0SMdDFC1dulQp\nKSl66aWX1Nvbq7KyMt1www368Y9/rMcff1yZmZms7xjyecf7Wtd3TJ6p7evrU11dnZ555hn5fD7N\nmTNHpaWl2rVrl93RMEwCgYAyMjKUmpoqr9crr9fLP3QxJBAI6MEHH1QwGIyYNzY26uTJk1q7dq0m\nTZqkxYsXKzs7W3V1dTYlRTQMdbwv3XfnnXeG17nX6+UbWIO1t7erublZ69evV3p6unJzc7V06VLV\n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\nf9qNN954xVwLFizQxo0bVVZWpvr6ei1evPgLfDYA4CzsqQWAEdDb26vf//73+slPfqJVq1Zp3rx5\n8vl8CgQCERdkfXIf6x133KGzZ8/Ksizdeuut4bdf//rXamho+EJ/bnp6uiRFvEzYxYsXVVBQoDfe\neEOSVFhYKMuyVFtbq56eHn33u9+NxqcMACOKM7UAEGUnTpzQ/v37I2Yej0fJyclqaGjQnXfeqb6+\nPu3atUt+v1/Z2dnhx9100006ceKEenp6NHPmTPl8Pq1YsULl5eUaP368XnzxRe3Zs0dFRUVfKMtt\nt92me++9V2vXrtXq1as1duxY1dTUyLIsTZ8+XZI0evRozZkzR1u3btXs2bMjtjIAgCkotQAQZfX1\n9aqvr4+YTZgwQZs2bdL69etVVFSkr3zlK8rLy9PKlStVU1OjUCgkj8ejhx9+WFVVVTp27Jj27Nmj\n2tpaVVVVacWKFerr61N6erq2bNkSLqRfxLp161RVVaXly5fLsixlZWXpN7/5jVJSUsKP+d73vqf6\n+notWLAgas8DAIykuEFeiBAArnuvvvqqNm/erDfffNPuKADwpXCmFgCuY36/X4FAQL/85S/DP/AB\nAEzEhWIAcB37+9//rueee045OTmUWgBGY/sBAAAAjMeZWgAAABiPUgsAAADjUWoBAABgPEotAAAA\njEepBQAAgPEotQAAADAepRYAAADGo9QCAADAeP8H57EKKo6CXFIAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x106e6e128>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.regplot('Latency', 'Throughput',\n",
    "           data=pd.DataFrame(X, columns=['Latency', 'Throughput']), \n",
    "           fit_reg=False,\n",
    "           scatter_kws={\"s\":20,\n",
    "                        \"alpha\":0.5})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# estimate multivariate Gaussian parameters $\\mu$ and $\\sigma^2$\n",
    "> according to data, X1, and X2 is not independent"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 14.11222578  14.99771051] \n",
      "\n",
      "[[ 1.83862041 -0.22786456]\n",
      " [-0.22786456  1.71533273]]\n"
     ]
    }
   ],
   "source": [
    "mu = X.mean(axis=0)\n",
    "print(mu, '\\n')\n",
    "\n",
    "cov = np.cov(X.T)\n",
    "print(cov)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[0, 0],\n",
       "        [0, 1],\n",
       "        [0, 2]],\n",
       "\n",
       "       [[1, 0],\n",
       "        [1, 1],\n",
       "        [1, 2]],\n",
       "\n",
       "       [[2, 0],\n",
       "        [2, 1],\n",
       "        [2, 2]]])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# example of creating 2d grid to calculate probability density\n",
    "np.dstack(np.mgrid[0:3,0:3])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x106e67c50>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n8XmORLu1ZkmLtK9ftdXWyc6ZvbvHcmZHy7EfAoAmO+HNWZLk9Xp11VVX6ZJLLpmTogCc3ubigAFp\nqtdVy484HL/eSiBpYdivvcmECmvPlmdkUO6RQZW7FkqSfP192piMa2L3gNLRTuUiberatU2xod0K\nTI7Ln00pEmzRoDsky+WVy67IsO1qK6kh5U2/ku6oOtKjcgc9CnlNKV1QpJRTRdKYt1ULrEkVDVtu\nVVSSobQnoElPsH7AgCS9Z/QFrUsPKFAuakEhoe6ANBhZrHLeo6LHJ7ddUd7rVzrQokg+qRF1qysx\npLPbJE88p1porW3MOtLpWQDgVHO2OQsAGjHXBwwcjjHVSlBTaYlWZ5emU7KDYbnSKfnS1dmmRj6r\nzpBXhUJOuUibWkf3y5vPyl0uqeJ2y1fMKbxoocZTpvLpUUm2LLdPk4Goti0+W/FIh5aO71Znckie\nUlld1rBaywW12mXt8Lap5Harxcop6/Zp0hOUv1JSzl3tYx30RxW1smot5RR0VRQoWyobbhmT+5U1\nAzJsQ1kzJENSxgwr7w3Uj6HtGd+lkBFSy9igLNNfb3XwZ5L1FdfDtQkAgBMdV4/r4OCgvvWtb6mv\nr08ej0dnnHGGPvzhD8/p4QMAMBtHO5BgeiuBEY1pdc9y9f/61zOesQ3JMxGXK52Skc2ou2eBkhVp\nsnORQpNjcpeKcpXLSnQuVCHUqjZPTpOR9RobGlHeDGjb4jfr1aVnqSsxpESoTRlfSOv3bVHAyspt\nl6WyFA259fzK/6dQMaNILqFUICqPVVRbbkJ5j1++pWfIJymaeklmtiBDtlyVimwZqrg9cpdLyvmC\nSgTbNNS2WHvbl2kk2q0PTm5Ri5KyUkVZpl/eqdAtHThMYTahtZE2gSWxwKyfBYC51nBwfe2113TV\nVVfJ7/fr7LPPVqVS0Q9+8AN961vf0ne+8x2dccYZJ6NOADiiY4bXaa0Ey3qWaN+0MVB2KCJNxFUJ\nR2SbfpXaYlq6Yo1+UWqTP51Q985e5YMh2R6PzOykKm6fCqEW5TYsUybaqVft7vrKZ03eY6piuJTz\nBmR5fCqYfoWKaUnGVHeBrWApq4LHr3SwRT3ju5T2hZUNhJTJhGSW8ip6TaUDEbnLJZmlgrK+kEZb\nF9RD6zvDWQUGJmTmUjJzKaWjnRpdukYlM3DUDVkHo7cVgJM0HFzvuOMOnX/++br77rtlmtVvcxUK\nBd1www2666679C//8i9zXiQAHMtsj4J19yzXYkm79wyo0hKVK5mYmjBQ3SBWbu+StahH75Bknv82\n7ff45C3k5CpZ8hSLMlSQmau2F4wvXqU3d8a0YNeQEuMH3mOobZEMW+pIj8hye1XwmGrJJuW3cgoW\nqyO7/Fa+2pKarZ581WEMKx5ur36smJOnXNJ4pENlt0f+bEK2bSiSm9TZbdLw8pj8u4amTUDIKReJ\nad+bzqnXcDLaA1htBdBsDQfX559/Xv/+7/9eD62SZJqmPvnJT+qqq66a0+IAoBGNhNeVPcvVO5aU\nV5J7+6sy8lnZ/qCKK9fUn6u0RLVo2ULtiOfVMrZfmalvv3sL1ffwZ5KSBpQPtUyboSo9bXdqb/ty\nLR3frWo6NWTIViieVntqTOFcUuORTsk2FCuOSZIKbr8KXikebpffymtnxyrFIx1aN/CSJEOxiE8x\npTUw9d75UItCiVHlIm3KRdo0vvhAv/BsQyurrQCcpuHgGgqFZFnWIfcPdw8A5rMzO1pUzoZ1pDP/\nakP5l3Uk5A0bGtm1T5YZkGVWVx479vbJW8gp09qusteUZGh88UotmNrNX9Q6SdLwC9u0fu/Las1N\nyFue+rvSNpQOhFS23Mp7/UoFWmXLUCLUppS/RQs2rtMCSZ42qbw3oEIhL8v0qzT13rWJAdNntUon\nL7Sy2gpgPmg4uL797W/XHXfcofvvv1/RaPWIwHg8rjvvvFMXXHDBnBcIAI2Y7aprjZ2Iq2vJIg2m\n85KmDiQ46IQpryR7bETdXVEZ+az2FDySbIUTo/Lms2od3aexJaslSe37pHB8eEav6YKN69RijClc\nGlMl6FPFH1RbICx3x9Q4LkktqrYeFDuXKDitvtqhCLnIgeua6bNaG2kNYKUVgFM1HFw/+9nP6iMf\n+YguuugiLV++XIZhaOfOnYpGo/riF794MmoEgIbUVgdnE2BrI7MWhv0aTOdVaYke8owrmZCkei/s\nIkmeoQHFJblLlsoer8KJUUlSdGi3PKWiUm0LlOheJqkaMMcXr1QgFa8/Z5n+w55wdbAjrazWNNrL\nejyhldVWAPNFw8F14cKFeuKJJ/SjH/1Ir7/+umzb1oc+9CF94AMfUDgcPhk1AjhNFXb2n/AhBEcz\nm9XX6SOzFq+JyT3V+zpdpSUqTZtEUFy5RpVwRDH1yohF5CrkNZopyZvPyMxWN25FJkZUCLXU56nW\nAmf71OlW44tX1e8d64Srw52CdTybrwitAJyu4eB6xRVX6LbbbuN4VwAnpLCzX7lXtkpS/fjXpobX\naSOzagGvFmBrva6uZKK+IlvxB1RcfaYq/oBc+Zxa0in5tvfKFfDInU5qzO2Vt5CXp5DTgl3b6qul\nxzrNqnV0YM5WV6cjtAI4HTQcXPfu3atgMHjsBwHgKErx+CHXcxVcD17JbbTvtWZ6gLUW9UiLeuTd\nv0e+/r4DdXctVGHt2ZKkSjgi3/ZeldvaFfF6FXZ7tHBylwzLku31quhO6snYusO+V+vogNr37VAg\nNaFFyxZKuZSKnlA9NB8v+lkBnE4aDq4f//jH9YUvfEEf+9jH1NPTI7/fP+PjixYtmrPiAJy+PLFY\nfaW1dj0XjrSSO9u+1/KeXSr39Uqy5V6zTu6e5TMCbK3ftWb6Zq7chvMlSe6RQcnjlTs+Ks/IkDzx\nUVV8plzplC58z8JDwqh3/x75cvvkKY7JbaVUSpgqR2OHbBRrxIkGVlZbAcxHDQfXe++9V+VyWc88\n84wMw6jft21bhmGot7d3TgsEcHqqra7OdY/rsVZyj7b6Wt6zS6X/+5Xs4UFJkh2vnipQ64M9s6NF\n5Z4lquST9SkE0zdzeffvkSudkh0MyzM0IMOy5EonZRTycpXLcmUz8u7sOyS41sKw7Q9K6ZSMfFZS\n7LAbxY6FwArgdNZwcH344YdPRh0A3oDMFSvnvK/VE4spu/VlVTIZuUIhBdafdcgzR1p9tRNx2dnM\ngRvZjOxEfEb/ay3ELkrEZURnbuaavhpr+4OSsqqEW+TKZVWJtMoOhmTYh9Zc2/xVnVogldpislas\nmXWbwFy1AxBaAcx3DQfX884772TUAQBzxz7o5yM4OMAa0ZiMYEh2amqqQDAkI3poC8ORNnNNX40t\nR2OqhJfJWrhEvj07ZXu9h5zMVTN981dx5ewC61z3rhJaAThBw8E1n8/roYce0tatW5XP52XbM/+f\n4ZFHHpmz4gCgUaV4XN6ODkkd9etjrerWA6yWS9IhPa6zdbjVWEmyfvuUKoP7NBhuO2IorW3+OtjJ\n3lxFYAXgJA0H13/4h3/QT3/6U/3e7/0eG7EAzDsnsulrSSwgxc7UQANh9WAHr8aW9+ySUpNyhcNa\nLEuubLyhMHyyEFgBOFHDwfW///u/de+99+qiiy46GfUAwAmZi01fjZy8dSx2In7odZODK6EVgFM1\nHFwNw9Dq1atPRi0AMCemh9fp142aHvCON8TWjpSdft0MhFUAp4OGg+u73/1u/eAHP9CnPvWpk1EP\nAJywEz2V63BH0R5viJ1+pOz0vtdThcAK4HQyq+B600031X+dyWT0H//xH/rNb36j5cuXy+VyzXj2\n9ttvn9sKAaBBJ3Iq12xCb6Mh9uC+15OJoArgdDar4DowMDDj+txzz5Uk7d+//3CPA0BTncgGrVro\ntcbHVMlkJMM4aug9XFCci97Y2SKoAngjmVVwffbZZ/XrX/9a7e3tJ7seADhhJ7JBq3aAgTX1D3Nr\ndFSFnf0NvcbRwuTxhFrCKQBUzSq4HjyrFQDmu+M9lctcsVKeba9UT94KhuTt6Gio1eBYCKEAcPwa\n3pwFAKe74Lr1Mqb9g302rQaH29AFAJhbsw6uP/vZzxQOh4/53KWXXnpCBQFAszXaanCiUwwAALMz\n6+B62223HfMZwzAIrgBOC420GpzIFAMAwOzNOrg+9dRTbM4CgMM4kSkGAIDZm1VwNQzjZNcBAI41\nF8fMAgCOjakCADAHjneKAQBg9lzHfkS67LLLZJrmya4FAAAAOKJZrbhyjCsAAACabVYrrgAAAECz\nEVwBAADgCARXAAAAOALBFQAAAI5AcAUAAIAjEFwBAADgCARXAAAAOALBFQAAAI5AcAUAAIAjEFwB\nAADgCARXAAAAOALBFQAAAI5AcAUAAIAjEFwBAADgCARXAAAAOIKn2QUAANBshZ39KsXj8sRiMles\nbHY5AI6A4AoAeEMr7OxX7pWtkiRrcL8kEV6BeWpetQoUi0V94AMf0DPPPFO/NzAwoGuuuUYbN27U\n+9//fj311FNNrBAAcLopxeNHvQYwf8yb4FosFvWZz3xG27dvn3H/k5/8pLq6uvT9739fl1xyia67\n7joNDQ01qUoAwOnGE4sd9RrA/DEvWgV27Nihz372s4fcf/rpp7V3715997vflWmauvbaa/X000/r\n8ccf13XXXdeESgEAp5taWwA9rsD8Ny9WXH/3u9/pggsu0GOPPSbbtuv3X375Za1fv16madbvnXPO\nOXrxxRebUSYA4DRlrlip0DnnElqBeW5erLh+5CMfOez90dFRdXV1zbjX3t6u4eHhU1EWAAAA5pF5\nseJ6JLlcTj6fb8Y9n8+nYrHYpIoAAADQLPM6uJqmeUhILRaL8vv9TaoIAAAAzTKvg+uCBQs0Ojo6\n497Y2Jg6OzubVBEAAACaZV4H17e85S3atm3bjFXX5557Ths2bGhiVQAAAGiGeR1czzvvPC1cuFA3\n3nijtm/frgcffFBbtmzRFVdc0ezSAAAAcIrNu+BqGEb91y6XS1/96lc1Ojqqyy+/XD/5yU/0wAMP\nqLu7u4kVAgAAoBnmxTis6Xp7e2dcL126VI8++miTqgEAAMB8Me+CKwDMJ4Wd/ZyoBADzBMEVAI6g\nsLNfuVe2SpKswf2SRHgFgCaadz2uADBflOLxo14DAE4tgisAHIEnFjvqNQDg1KJVAACOoNYWQI8r\nAMwPBFcAOApzxUoCKwDME7QKAAAAwBEIrgAAAHAEgisAAAAcgeAKAAAARyC4AgAAwBEIrgAAAHAE\ngisAAAAcgeAKAAAARyC4AgAAwBEIrgAAAHAEgisAAAAcgeAKAAAARyC4AgAAwBEIrgAAAHAEgisA\nAAAcgeAKAAAARyC4AgAAwBEIrgAAAHAEgisAAAAcgeAKAAAARyC4AgAAwBEIrgAAAHAEgisAAAAc\ngeAKAAAARyC4AgAAwBEIrgAAAHAEgisAAAAcgeAKAAAARyC4AgAAwBEIrgAAAHAEgisAAAAcgeAK\nAAAARyC4AgAAwBEIrgAAAHAEgisAAAAcgeAKAAAARyC4AgAAwBEIrgAAAHAEgisAAAAcgeAKAAAA\nRyC4AgAAwBEIrgAAAHAEgisAAAAcgeAKAAAARyC4AgAAwBEIrgAAAHCEeR9cf/7zn2vt2rU688wz\n6z9/6lOfanZZAAAAOMU8zS7gWLZv365Nmzbptttuk23bkiTTNJtcFQAAAE61eR9cd+zYoTPOOEOx\nWKzZpQAAAKCJ5n2rwI4dO7RixYpmlwEAAIAmm/fBdefOnfrVr36lP/zDP9S73/1u3X333bIsq9ll\nAQAA4BSb160C+/fvVz6fl2mauu+++zQwMKDbbrtNhUJBn//855tdHgAAAE6heR1cFy1apN/+9rdq\naWmRJK1du1aVSkWf+9zndNNNN8kwjCZXCAAAgFNl3rcK1EJrzapVq1QoFJRIJJpUEf7/9u49pur6\nj+P4C0UuCoSceS9nYg68IUMlTLMfkLN5T1e6pYYhLS1vs1BQ8TYI0My8Fc5OJuosMnVsLWNupg3z\nUgqKzgS8MJ0BQelCjgq/P37z/H6n1Nxvh/M938PzsTH9fs5XffHxLb48fg4AAAAYwa2L65EjRxQd\nHa36+nr7WklJiYKDg9W2bVsDkwEAAMDV3Lq4RkZGyt/fX6mpqSovL9ehQ4eUnZ2tGTNmGB0NAAAA\nLubWZ1zbtGmjrVu3Kj09XRMnTlSbNm00adIkTZ8+3ehoAAAAcDG3Lq7Sf860bt261egYAAAAMJhb\nHxUAAAAA7qO4AgAAwBQorgAAADAFiisAAABMwe1fnAUAAKT68jLd/e03eYeEyPfp7kbHAQxBcQUA\nwM3Vl5ep7uwZSdKd69ckifKKZomjAgAAuLm7v/32yGuguaC4AgDg5rxDQh55DTQXHBUAAMDN3T8W\nwBlXNHcUVwAATMD36e4UVjR7HBUAAACAKVBcAQAAYAoUVwAAAJgCxRUAAACmQHEFAACAKVBcAQAA\nYAoUVwAAAJgCxRUAAACmQHEFAACAKVBcAQAAYAoUVwAAAJgCxRUAAACmQHEFAACAKVBcAQAAYAoU\nVwAAAJgCxRUAAACmQHEFAACAKVBcAQAAYAoUVwAAAJgCxRUAAACmQHEFAACAKVBcAQAAYAoUVwAA\nAJgCxRUAAACmQHEFAACAKVBcAQAAYAoUVwAAAJgCxRUAAACmQHEFAACAKVBcAQAAYAoUVwAAAJgC\nxRUAAACmQHEFAACAKVBcAQAAYAoUVwAAAJgCxRUAAACmQHEFAACAKVBcAQAAYAoUVwAAAJgCxRUA\nAACmQHEFAACAKVBcAQAAYAoUVwAAAJiC2xdXm82mlJQUDRw4UEOHDpXVajU6EgAAAAzgbXSAf5KZ\nmamSkhJt375dFRUVSk5OVpcuXTR8+HCjowEAAMCF3PoZ17q6OuXl5Wnx4sUKCwtTfHy8EhMTlZub\na3Q0AAAAuJhbF9fz58/r3r176t+/v30tKipKRUVFBqYCAACAEdy6uFZWVio4OFje3v890WCxWFRf\nX6+amhoDkwEAAMDV3Lq41tXVycfHx2Ht/rXNZjMiEgAAAAzi1i/O8vX1/VtBvX/t7+9vRKR/1D6w\nldERAAAAPJJbP+PaoUMH1dbWqqGhwb5WVVUlPz8/BQUFGZgMAAAArubWxTU8PFze3t46deqUfe3E\niRPq06ePgakAAABgBLcurn5+fho7dqzS0tJUXFysgoICWa1WTZs2zehoAAAAcDG3PuMqSYsWLdLy\n5cs1bdo0BQYGas6cOYqPjzc6FgAAAFzM7Yurn5+fMjIylJGRYXQUAAAAGMitjwoAAAAA91FcAQAA\nYAoUVwAAAJgCxRUAAACmQHEFAACAKVBcAQAAYAoUVwAAAJgCxRUAAACmQHEFAACAKVBcAQAAYAoU\nV0oKW3oAAAxtSURBVAAAAJgCxRUAAACm4G10gKZUWVmpu3fvKi4uzugoAAAAeIDr16+rZcuWj3Wv\nRxdXHx8fNTY2Gh0DAAAAD+Ht7S0fH5/HuterkWYHAAAAE+CMKwAAAEyB4goAAABToLgCAADAFCiu\nAAAAMAWKKwAAAEyB4goAAABToLgCAADAFCiuAAAAMAWKKwAAAEyB4uokNptNKSkpGjhwoIYOHSqr\n1Wp0pGahoKBAYWFhCg8Pt387Z84co2N5LJvNptGjR+v48eP2tYqKCiUkJCgyMlKjRo3SDz/8YGBC\nz/SgfV+1atXfZn/Hjh0GpvQcN27c0OzZsxUdHa1hw4bp/fffl81mk8S8N6VH7Tvz3nSuXLmiN954\nQ5GRkYqNjdXWrVvtj7njvHsbHcBTZGZmqqSkRNu3b1dFRYWSk5PVpUsXDR8+3OhoHu3ixYuKjY3V\nqlWrdP+rF/v6+hqcyjPZbDbNnz9fFy9edFifNWuWwsLC9NVXX6mgoEBvv/22vvnmG3Xs2NGgpJ7l\nYfteVlamBQsWaPz48fa1gIAAV8fzSLNnz1ZwcLB27typ2tpapaSkqGXLlnr33Xc1c+ZMhYeHM+9N\n4FH7zrw3jcbGRiUlJSkiIkL79u3TpUuXNH/+fHXs2FEjR450y3nnGVcnqKurU15enhYvXqywsDDF\nx8crMTFRubm5RkfzeKWlpXrmmWcUEhIii8Uii8XCB7MmUFpaqldeeUUVFRUO64WFhbp69apWrFih\n7t27KykpSf3791deXp5BST3Lw/b9/mO9evWyz73FYuEfbU5QVlamoqIiZWRkKDQ0VFFRUZo9e7by\n8/N19OhRVVRUMO9N4FH7LjHvTaWqqkq9evVSWlqaunbtqueff14xMTE6efKk2847xdUJzp8/r3v3\n7ql///72taioKBUVFRmYqnkoLS3V008/bXQMj3fs2DHFxMRo9+7d9me2JamoqEi9e/d2+AskKipK\np06dMiKmx3nYvt+6dUs3btxQt27djAvnodq1a6ctW7YoJCTEYf3mzZs6ffo0895EHrTvjY2Nunnz\nJvPehNq1a6cPPvhArVu3liSdPHlSJ06c0KBBg9x23jkq4ASVlZUKDg6Wt/d/t9Nisai+vl41NTVq\n27atgek8W3l5uQ4fPqzNmzeroaFBI0aM0OzZs9WqVSujo3mUyZMnP3C9srJS7du3d1izWCy6ceOG\nK2J5vIfte1lZmby8vLR582Z9//33Cg4OVkJCgsaNG+fihJ4nMDBQQ4YMsV83NjYqNzdXMTExzHsT\neti+Dx48mHl3kdjYWF2/fl0vvPCChg8frvT0dLecd4qrE9TV1cnHx8dh7f71/YPlcL5r167p9u3b\n8vX11bp161RRUaFVq1apvr5eKSkpRsdrFh42+8x90yorK1OLFi0UGhqqKVOm6NixY1qyZIkCAgIU\nHx9vdDyPkpWVpXPnzikvL09Wq5V5d5GsrCydP39eeXl5OnPmDPPuAuvXr1dVVZWWLVum9PR0t/34\nTnF1Al9f37/9Rt6/9vf3NyJSs9C5c2f9+OOPCgoKkiSFhYWpoaFB7733nhYtWiQvLy+DE3o+X19f\n/f777w5rNptNfn5+BiVqHsaNG6fY2Fj77Pfs2VOXLl3Srl27+IvcibKzs7V9+3Z9+OGH6tGjB/Pu\nIn/d9x49ejDvLtC7d29J0sKFC7VgwQJNnDhRf/zxh8M97jDvnHF1gg4dOqi2tlYNDQ32taqqKvn5\n+dn/oKFp/HV/Q0NDVV9fr9raWoMSNS8dOnRQZWWlw1pVVZXatWtnUKLm46+z3717d/36668GpfE8\nK1eu1LZt25SdnW0vR8x703vQvkvMe1Oprq5WQUGBw1qPHj10584dtWvXzi3nneLqBOHh4fL29nY4\nsHzixAn16dPHwFSe78iRI4qOjlZ9fb19raSkRMHBwZwrdpGIiAiVlJQ4/I/DyZMnHV6oCOf76KOP\nlJCQ4LB27tw5XqjoJBs2bNDu3bu1du1avfTSS/Z15r1pPWzfmfemU1FRoXfeecehoBYXF8tisSgq\nKkpnz551u3mnuDqBn5+fxo4dq7S0NBUXF6ugoEBWq1XTpk0zOppHi4yMlL+/v1JTU1VeXq5Dhw4p\nOztbM2bMMDpaszFo0CB16tRJCxcu1MWLF5WTk6Pi4mJNnDjR6Gge7V//+peOHz8uq9Wqq1evaufO\nndq/f78SExONjmZ6paWl2rx5s5KSkhQZGamqqir7G/PedB6178x70+nbt6/69OmjRYsWqbS0VIcO\nHdLq1av11ltvaeDAgW45716N//s5VvB/u337tpYvX65vv/1WgYGBSkxM1JQpU4yO5fFKS0uVnp6u\nU6dOqU2bNpo0aZJmzpxpdCyPFh4ers8//1wDBw6UJF29elUpKSkqKipS165dlZqaqmeffdbglJ7n\nr/t+8OBBrVu3TpcvX1aXLl00b948zvs5QU5OjtauXeuw1tjYKC8vL507d05XrlxRamoq8+5k/7Tv\nzHvTqays1MqVK1VYWCh/f3+99tprSkpKkuSeH98prgAAADAFjgoAAADAFCiuAAAAMAWKKwAAAEyB\n4goAAABToLgCAADAFCiuAAAAMAWKKwAAAEyB4goAAABToLgCAADAFCiuAOBEsbGx2rBhw//94y9e\nvKhDhw45MREAeA6KKwC4kTfffFPFxcVGxwAAt0RxBQA30tjYaHQEAHBbFFcAcBGbzabMzEzFxcWp\nT58+io6O1ty5c1VTUyPpP8cMrl+/ro0bN2rq1KmSpFu3bmnJkiWKiYnRgAED9Prrr+vMmTP2n3PD\nhg1KSEjQli1bNGzYMPXr109TpkxRWVmZ/Z4///xTK1eu1JAhQxQZGakpU6bo7Nmzunv3rgYPHqxN\nmzY55Ny1a5eGDBlCiQbgdiiuAOAi2dnZKigoUGZmpr777jtlZmaqsLBQH3/8sSQpLy9PHTp0UEJC\ngv2cbGJioq5du6acnBx9+eWXioiI0OTJk3X+/Hn7z3vixAmdPHlSW7Zs0a5du1RdXa0VK1bYH58z\nZ46OHDmirKws7d+/X08++aSmT5+uuro6jRkzRvv27XPIuW/fPo0fP15eXl4u2BUAeHzeRgcAgOai\nX79+GjFihKKioiRJnTp10nPPPacLFy5IkkJCQtSiRQu1bt1aQUFBKiwsVFFRkY4ePaqgoCBJ0rx5\n8/TTTz9p27ZtysjIkCTdu3dPq1evVkBAgCTp1Vdf1Zo1ayRJZWVlOnz4sKxWq2JiYiRJy5cvV3Bw\nsGpqajRx4kR99tlnOn36tCIiInTp0iWdOnVK6enpLt0bAHgcFFcAcJHRo0ersLBQa9as0aVLl1RW\nVqby8nINGDDggfeXlJSooaFBw4YNc1i/c+eO7ty5Y7+2WCz20ipJQUFB9scvXLggLy8v9evXz/64\nj4+PkpOT7dd9+/bV3r17FRERoa+//loRERHq3r27U95nAHAmiisAuMjSpUt14MABjR8/XnFxcZo1\na5a2bt2qGzduPPD+hoYGBQYGas+ePX97zMfH54Hf/6tWrVr9Y64JEyZo7dq1SklJUX5+vpKSkh7j\nvQEA1+OMKwC4QG1trb744gstW7ZMycnJGjdunMLCwlRaWurwIqj/PVfas2dP3bp1SzabTU899ZT9\n7ZNPPlFBQcFj/bqhoaGS5PAptu7du6fY2FgdOHBAkjRq1CjZbDZZrVZVV1dr5MiRzniXAcDpeMYV\nAJzs8uXLOnz4sMOar6+vgoKCVFBQoF69eqmurk65ubkqKSlR//797fe1bt1aly9fVnV1tYYOHaqw\nsDDNmzdPqamp6tSpk3bs2KG9e/dqzJgxj5WlW7duevHFF7VixQqlpaWpffv2ysnJkc1m06BBgyRJ\nAQEBio+P16ZNmxQXF+dw7AAA3AnFFQCcLD8/X/n5+Q5rnTt31rp165SRkaExY8boiSeeUHR0tObP\nn6+cnBzV19fL19dXU6dOVVZWln755Rft3btXVqtVWVlZmjdvnurq6hQaGqqNGzfaS+fjSE9PV1ZW\nlubOnSubzaaIiAh9+umnCg4Ott/z8ssvKz8/XxMmTHDaPgCAs3k18on6AKDZ27NnjzZs2KCDBw8a\nHQUAHopnXAGgGSspKVFpaanWr19v/6IHAOCueHEWADRjP//8s5YuXarIyEiKKwC3x1EBAAAAmALP\nuAIAAMAUKK4AAAAwBYorAAAATIHiCgAAAFOguAIAAMAUKK4AAAAwBYorAAAATIHiCgAAAFP4Nwis\n8Ezq9hEEAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x112d27748>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# create multi-var Gaussian model\n",
    "multi_normal = stats.multivariate_normal(mu, cov)\n",
    "\n",
    "# create a grid\n",
    "x, y = np.mgrid[0:30:0.01, 0:30:0.01]\n",
    "pos = np.dstack((x, y))\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "\n",
    "# plot probability density\n",
    "ax.contourf(x, y, multi_normal.pdf(pos), cmap='Blues')\n",
    "\n",
    "# plot original data points\n",
    "sns.regplot('Latency', 'Throughput',\n",
    "           data=pd.DataFrame(X, columns=['Latency', 'Throughput']), \n",
    "           fit_reg=False,\n",
    "           ax=ax,\n",
    "           scatter_kws={\"s\":10,\n",
    "                        \"alpha\":0.4})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# select threshold $\\epsilon$\n",
    "1. use training set $X$ to model the multivariate Gaussian\n",
    "2. use cross validation set $(Xval, yval)$ to find the best $\\epsilon$ by finding the best `F-score`"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img style=\"float: left;\" src=\"../img/f1_score.png\">"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best epsilon: 2.8762918640653916e-05\n",
      "Best F-score on validation data: 0.6666666666666666\n"
     ]
    }
   ],
   "source": [
    "e, fs = anomaly.select_threshold(X, Xval, yval)\n",
    "print('Best epsilon: {}\\nBest F-score on validation data: {}'.format(e, fs))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# visualize prediction of `Xval` using learned $\\epsilon$\n",
    "1. use CV data to find the best $\\epsilon$\n",
    "2. use all data (training + validation) to create model\n",
    "3. do the prediction on test data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "             precision    recall  f1-score   support\n",
      "\n",
      "          0       0.99      1.00      1.00       147\n",
      "          1       1.00      0.86      0.92         7\n",
      "\n",
      "avg / total       0.99      0.99      0.99       154\n",
      "\n"
     ]
    }
   ],
   "source": [
    "multi_normal, y_pred = anomaly.predict(X, Xval, e, Xtest, ytest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x13002ff28>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nl55//nnV19frW9/6lsrKyvS5z33O6NImtOrqai1ZskSrVq1Scvdip9NpcFUTUzgc1l133aXq6uq0\n81//+tc1e/Zsvfzyy3rzzTe1YsUK/eEPf1BpaalBlU4sg73vtbW1uvvuu7Vs2bLUOY/HM97lTUgr\nV65Ufn6+XnzxRXV0dOj++++XzWbTN7/5TX3ta1/TnDlz+HkfA0O97/y8j414PK7ly5fr/PPP16uv\nvqr9+/frrrvuUmlpqa644oqM/HlnxXUU9PT0aNOmTfrOd76j2bNna+nSpbrtttv0wgsvGF3ahFdT\nU6NzzjlHhYWF8vl88vl8/DIbAzU1Nbr++utVX1+fdv6dd97RoUOH9IMf/EAVFRVavny5FixYoE2b\nNhlU6cQy2PuefGzu3Lmpn3ufz8d/tI2C2tpabd++XatXr1ZlZaUWLVqklStX6ne/+53++te/qr6+\nnp/3MTDU+y7x8z5WWlpaNHfuXH33u9/V9OnT9dnPflaLFy/W1q1bM/bnneA6Cvbs2aNoNKoFCxak\nzi1atEjbt283sKqzQ01NjcrLy40uY8J79913tXjxYr300kuplW1J2r59u+bNm5f2fyCLFi3Stm3b\njChzwhnsfQ8EAmpqatLMmTONK26CKioq0v/f3v3HVF3vcRx/HqccICCSIcN+rAlzWMiJqRBGs8Ca\nrSJMtnILi0a0apW0lgrzJw3HQSMSpQ6rk2Wxihk6/snO3Ag3+gGlouDMc4B0OgMGpQvPIQ/3j7vO\nvcerN9cO5we8HtvZ+L7Pl8P7fHhzeO3wOYeGhgZmzpzpVb9w4QJHjhzRvE+Qq637+Pg4Fy5c0LxP\noPj4eN566y0iIyMB6OzspKOjg4yMjKCdd20V8IGBgQFiY2OZPv0/yxkXF4fT6WR4eJibbropgN1N\nbr29vbS1tVFfX4/b7WbZsmW88sorzJgxI9CtTSorV668an1gYIBZs2Z51eLi4jh//rw/2pr0rrXu\nDocDg8FAfX0933zzDbGxsRQVFZGfn+/nDief6OhosrOzPcfj4+Ps2bOHrKwszfsEuta6L168WPPu\nJzk5OZw7d4777ruPBx98kMrKyqCcdwVXHxgdHSUsLMyr9tfxXxvLxffOnj3LpUuXMBqN1NbWcubM\nGd58802cTidlZWWBbm9KuNbsa+4nlsPhYNq0aSQlJVFYWMj333/P+vXriYqKYunSpYFub1Ixm830\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1150b6cc0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# construct test DataFrame\n",
    "data = pd.DataFrame(Xtest, columns=['Latency', 'Throughput'])\n",
    "data['y_pred'] = y_pred\n",
    "\n",
    "# create a grid for graphing\n",
    "x, y = np.mgrid[0:30:0.01, 0:30:0.01]\n",
    "pos = np.dstack((x, y))\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "\n",
    "# plot probability density\n",
    "ax.contourf(x, y, multi_normal.pdf(pos), cmap='Blues')\n",
    "\n",
    "# plot original Xval points\n",
    "sns.regplot('Latency', 'Throughput',\n",
    "            data=data,\n",
    "            fit_reg=False,\n",
    "            ax=ax,\n",
    "            scatter_kws={\"s\":10,\n",
    "                         \"alpha\":0.4})\n",
    "\n",
    "# mark the predicted anamoly of CV data. We should have a test set for this...\n",
    "anamoly_data = data[data['y_pred']==1]\n",
    "ax.scatter(anamoly_data['Latency'], anamoly_data['Throughput'], marker='x', s=50)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# high dimension data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "mat = sio.loadmat('./data/ex8data2.mat')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X = mat.get('X')\n",
    "Xval, Xtest, yval, ytest = train_test_split(mat.get('Xval'),\n",
    "                                            mat.get('yval').ravel(),\n",
    "                                            test_size=0.5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best epsilon: 1.74667432759803e-19\n",
      "Best F-score on validation data: 0.9090909090909091\n"
     ]
    }
   ],
   "source": [
    "e, fs = anomaly.select_threshold(X, Xval, yval)\n",
    "print('Best epsilon: {}\\nBest F-score on validation data: {}'.format(e, fs))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "             precision    recall  f1-score   support\n",
      "\n",
      "          0       0.96      0.96      0.96        46\n",
      "          1       0.50      0.50      0.50         4\n",
      "\n",
      "avg / total       0.92      0.92      0.92        50\n",
      "\n"
     ]
    }
   ],
   "source": [
    "multi_normal, y_pred = anomaly.predict(X, Xval, e, Xtest, ytest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "find 4 anamolies\n"
     ]
    }
   ],
   "source": [
    "print('find {} anamolies'.format(y_pred.sum()))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The huge difference between my result, and the official `117` anamolies in the ex8 is due to:\n",
    "1. my use of **multivariate Gaussian**\n",
    "2. I split data very differently"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [default]",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
